home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
demovers
/
scripter
/
demo
/
gsplot.sic
< prev
next >
Wrap
Text File
|
1998-09-26
|
4KB
|
179 lines
//ACE-SICPAR 8 0080
/*
* Funktionsplotter fuer GEMstat
* Aufruf ohne Parameter: Funktion und Bereich werden per Dialog abgefragt
* Mit Parameter: gsplot.sic "Funktion" Start Ende
* Start und Ende sind optional und defaultmaessig -1 bzw. 1
* "Funktion" ist ein String wie z.B. "x * sin(x) - 1"
* Der Parameter ist immer x
*/
uses "math.lib";
/*
* Hauptfunktion
*/
proc main(...)
local StartWert, EndWert, Funktion;
{
StartWert = -1.0; // Defaultwerte, falls nicht angegeben
EndWert = 1.0;
precision(8); // Zum Malen in GEMstat reicht das vollkommen aus
/*
* Anmerkung: Die Anzahl der Werte koennte man vielleicht von der
* Fensterbreite abhaengig machen. Dazu muesste man sie aus GEMstat
* auslesen koennen. Oder man laesst sie direkt irgendwo einstellen.
*/
Anzahl_der_Werte = 80;
WertePaare.length = Anzahl_der_Werte * 2;
/*
* Je nachdem, ob Parameter uebergeben wurden, werden diese
* benutzt oder die Funktion und der Bereich per Dialog abgefragt.
*/
switch (argc) {
default: EndWert = float(argv[2]);
case 2: StartWert = float(argv[1]);
case 1: Funktion = string(argv[0]);
translate(f, "", "return " + Funktion + ";");
break;
case 0: Funktion = FunktionsEingabe();
BereichsEingabe(StartWert, EndWert);
break;
}
/*
* Hier wird geplottet. In der Variablen 'Funktion' steht jetzt noch
* der Ausdruck als String und koennte auch benutzt werden, um ihn
* im Fenster auszugeben.
*/
plot(StartWert, EndWert);
}
/*
* Die Wertepaare ausrechnen und anschliessend an GEMstat senden
*/
proc plot(start, end)
local i, x, width;
{
/*
* Startwert sollte kleiner als Endwert sein
*/
if (start >= end) throw("bad range", start, end);
/*
* Schrittweit zwischen den einzelnen x-Werten berechnen
*/
width = (end - start) / (Anzahl_der_Werte - 1);
/*
* Werte von <start> bis <end> berechnen und plotten
*/
for (i = 0, x = start; i < (Anzahl_der_Werte * 2); i += 2, x += width) {
WertePaare[i] = x;
WertePaare[i + 1] = f(x);
}
/*
* Werte zum Plotten an GEMstat, oder wen auch immer, uebergeben
*/
gemstat.plot(WertePaare);
}
/*
* Abfragen der Funktion, die geplottet werden soll.
*/
proc FunktionsEingabe()
local Term, Selektion, FunktionsDefinition;
{
Term = "";
do {
/*
* Eingabe in einem Dialog machen, der mit OK beendet werden muss.
*/
Selektion = "Keine";
FunktionsDefinition = dialog.input("Funktion f(x) eingeben:", Term);
if (FunktionsDefinition[0] != "OK") exit(0);
Term = FunktionsDefinition[1];
/*
* Hier wird die Funktion uebersetzt. Alle Uebersetzungsfehler
* werden abgefangen (durch catch("*")) und in diesem Fall wird
* nachgefragt, ob die Eingabe wiederholt werden soll.
*/
try {
translate(f, "", "return " + Term + ";");
}
catch ("*") {
Selektion = dialog.note("Fehler im Ausdruck:",
ExceptionData[0],
"-bNochmal", "-bAbbruch");
}
if (Selektion == "Abbruch") exit(0);
} while (Selektion == "Nochmal");
return Term;
}
/*
* Abfragen des x-Bereiches, der geplottet werden soll.
*/
proc BereichsEingabe(&Start, &Ende)
local Bereich, Selektion, BereichsDefinition, StartEnd;
{
Bereich = string(Start) + ", " + string(Ende);
do {
/*
* Den Bereich in einem Dialog eingeben lassen. Die Eingabe muss
* in der Form Startwert, Endwert erfolgen.
*/
Selektion = "Keine";
BereichsDefinition = dialog.input("Bereich eingeben (Start, Ende):", Bereich);
if (BereichsDefinition[0] != "OK") exit(0);
/*
* Die Eingabe war in Ordnung, wenn zwei durch Komma getrennte
* Werte eingegeben wurden und der Startwert kleiner dem
* Endwert ist. Ansonsten wird gefragt, ob die Eingabe
* wiederholt werden soll.
*/
StartEnd = split(BereichsDefinition[1], ", ");
if (StartEnd.length != 2) {
dialog.note("Fehler in der Eingabe:", BereichsDefinition[1],
"Anzahl der Werte ungleich 2",
"-bNochmal", "-bAbbruch");
}
else {
Start = float(StartEnd[0]);
Ende = float(StartEnd[1]);
if (Start >= Ende) {
dialog.note("Fehler in der Eingabe:",
"Start muss kleiner als Ende sein",
"-bNochmal", "-bAbbruch");
}
}
if (Selektion == "Abbruch") exit(0);
} while (Selektion == "Nochmal");
}
/*
* In diese Funktion wird der Ausdruck uebersetzt
*/
proc f(x)
{
return x;
}